package com.cxq.boot.provider;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.UUID;

//从阿里云上传下载图片
@Service
public class AliyunProvider {

    // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    @Value("${aliyun.afile.accessKeyId}")
    private String accessKeyId;//公钥
    @Value("${aliyun.afile.accessKeySecret}")
    private String accessKeySecret;//私钥

    //Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    @Value("${aliyun.endpoint}")
    private String endpoint;

    //存储空间 Bucket名
    @Value("${aliyun.bucket}")
    private String bucket;

    /**
     * @param fileStream 文件流
     * @param fileName   文件名
     * @return
     */
    public String upload(InputStream fileStream, String fileName) throws FileNotFoundException {

        System.out.println(endpoint + " " + accessKeyId + " " + accessKeySecret + " " + bucket);

        //通过文件名的 . 分割检查是否是文件，并将文件名修改之后上传，避免同名文件被覆盖
        String generatedFilename;
        String[] filePaths = fileName.split("\\.");
        if (filePaths.length > 1) {
            generatedFilename = UUID.randomUUID().toString() + "." + filePaths[filePaths.length - 1];
        } else {
            return null;
        }

        File newFile = new File(fileName);
        try {
            OutputStream os = new FileOutputStream(newFile);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = fileStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            fileStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        // 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件流。
        //InputStream fileStream1 = new FileInputStream("D:\\临时\\灌篮高手1.webp");
        InputStream updateFileStream = new FileInputStream(newFile);
        // 依次填写Bucket名称（例如examplebucket）和Object完整路径（例如exampledir/exampleobject.txt）。Object完整路径中不能包含Bucket名称。
        //ossClient.putObject("bucket", "other.png", fileStream);
        ossClient.putObject(bucket, generatedFilename, updateFileStream);
        // 关闭OSSClient。
        ossClient.shutdown();

        return generatedFilename;
    }
}
